package com.sojson.dao;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.ibatis.annotations.Param;

import com.sojson.base.BaseDao;
import com.sojson.entity.bo.Select;
import com.sojson.entity.po.Member;
import com.sojson.entity.vo.MemberVo;

/**
 * 用户表Dao
 * 
 * @author liu
 * @date 2021-03-16
 */
public interface MemberDao extends BaseDao<Member> {

    /**
     * 通过id删除(物理删除)
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    int deleteById(Integer id);

    /**
     * 通过id列表删除(物理删除)
     * 
     * @param ids
     * @return
     * @throws SQLException
     */
    int deleteByIdList(ArrayList<Integer> ids);

    /**
     * 通过id更新(全部更新)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateById(Member member);

    /**
     * 通过id列表更新(全部更新)(更新内容相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateStaticByIdList(Member member);

    /**
     * 通过id列表更新(全部更新)(更新内容不相同)
     * 
     * @param members
     * @return
     * @throws SQLException
     */
    int updateChangeByIdList(ArrayList<Member> members);

    /**
     * 通过id更新(局部更新)
     * 
     * @param member
     * @return
     */
    int updatePartialById(Member member);

    /**
     * 通过编号更新(局部更新)
     * 
     * @param member
     * @return
     */
    int updatePartialByNo(Member member);

    /**
     * 通过id列表更新(局部更新)(更新内容相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateStaticPartialByIdList(Member member);

    /**
     * 通过id列表更新(局部更新)(更新内容不相同)
     * 
     * @param members
     * @return
     * @throws SQLException
     */
    int updateChangePartialByIdList(ArrayList<Member> members);

    /**
     * 通过id查询
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    Member findById(Integer id);

    /**
     * 通过id列表查询
     * 
     * @param ids
     * @return
     * @throws SQLException
     */
    ArrayList<Member> findByIdList(ArrayList<Integer> ids);

    /**
     * 通过对象查询id列表
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    ArrayList<Integer> findIdByDto(Member member);

    /**
     * 清空数据(物理清空)
     * 
     * @throws SQLException
     */
    void clear();

    /**
     * 统计手机号相同的用户数量(判断手机号是否有用户,一个手机号只能有一个用户)
     * 
     * @param mobile 手机号
     * @return
     * @throws SQLException
     */
    int countByMobile(String mobile);

    /**
     * 通过手机号查询
     * 
     * @param roles     角色列表
     * @param mobile    
     * @return
     */
    int countByRoleMobile(@Param("roles") Set<String> roles, @Param("mobile") String mobile);

    /**
     * 统计相同帐号的用户数量(判断帐号是否有用户)
     * 
     * @param username 帐号
     * @return
     * @throws SQLException
     */
    int countByUsername(String username);

    /**
     * 通过手机号查询
     * 
     * @param mobile 手机号
     * @return
     * @throws SQLException
     */
    Member findByMobile(String mobile);

    /**
     * 通过手机号查询
     * 
     * @param roles     角色列表
     * @param mobile    
     * @return
     */
    Member findByRoleMobile(@Param("roles") Set<String> roles, @Param("mobile") String mobile);

    /**
     * 通过邀请码查询
     * 
     * @param invitationCode 邀请码
     * @return
     * @throws SQLException
     */
    Member findByInvitationCode(String invitationCode);

    /**
     * 通过用户ID查询用户现有佣金
     * 
     * @param id
     * @return
     */
    BigDecimal findBalanceById(int id);

    /**
     * 通过用户ID修改用户佣金
     * 
     * @param id
     * @param balance
     * @return
     */
    int updateBalanceById(@Param("id") Integer id, @Param("balance") BigDecimal balance);

    /**
     * 通过id更新手机号
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateMobileById(Member member);

    /**
     * 通过ID查询上级用户
     * 
     * @param id
     * @return
     */
    Member findTopById(Integer id);

    /**
     * 通过编号查询上级用户
     * 
     * @param no
     * @return
     */
    Member findTopByNo(String no);

    /**
     * 通过wxUnionid查询
     * 
     * @param wxUnionid
     * @return
     * @throws SQLException
     */
    Member findByWxUnionid(String wxUnionid);

    /**
     * 通过微信唯一标识查询
     * 
     * @param roles     角色列表
     * @param wxUnionid 微信唯一编号
     * @return
     */
    Member findByRoleWxUnionid(@Param("roles") Set<String> roles, @Param("wxUnionid") String wxUnionid);

    /**
     * 通过微信openid查询
     * 
     * @param roles     角色列表
     * @param openid
     * @return
     */
    Member findByRoleOpenid(@Param("roles") Set<String> roles, @Param("openid") String openid);

    /**
     * 通过帐号查询
     * 
     * @param username
     * @return
     */
    Member findByUsername(String username);

    /**
     * 通过角色和帐号查询
     * 
     * @param roles     角色列表
     * @param username  帐号
     * @return
     */
    Member findByRoleUsername(@Param("roles") Set<String> roles, @Param("username") String username);

    /**
     * 统计微信号相同的用户数量(判断微信号是否有用户,一个微信号只能有一个用户)
     * 
     * @param wxUnionid
     * @return
     */
    int countByWxUnionid(String wxUnionid);

    /**
     * 获取当前佣金信息
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    Member findBalance(Integer id);

    /**
     * 获取当前余额信息
     * 
     * @param id
     * @return
     */
    Member findBrokerage(Integer id);

    /**
     * 获取下级用户列表
     * 
     * @param member
     * @return
     */
    List<Member> findUnderlingByDto(Member member);

    /**
     * 获取简历
     * 
     * @param id
     * @return
     */
    MemberVo findResume(Integer id);

    /**
     * 获取简历
     * 
     * @param member
     * @return
     */
    List<MemberVo> findResumeList(Member member);

    /**
     * 获取用户的当前诚意金信息
     * 
     * @param userId
     * @return
     */
    MemberVo findDeposit(Integer userId);

    /**
     * 通过postApplyId查询
     * 
     * @param postApplyId
     * @return
     * @throws SQLException
     */
    Member findByPostApplyId(Integer postApplyId);

    /**
     * 根据对象查询
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    List<MemberVo> list(Member member);

    /**
     * 根据ID查询
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    MemberVo getInfo(Integer id);

    /**
     * 通过订单ID查询
     * 
     * @return
     */
    Member findMerchantByOrderId(Integer goodsId);

    /**
     * 通过编号查询
     * 
     * @param no
     * @return
     */
    Member findByNo(String no);

    /**
     * 获取对应角色的用户列表
     * 
     * @param member
     * @return
     */
    List<MemberVo> listByRole(MemberVo member);

    /**
     * 根据对象查询
     * 
     * @param member
     * @return
     */
    List<MemberVo> listUser(MemberVo member);

    /**
     * 获取下拉列表
     * 
     * @param member
     * @return
     */
    List<Select> select(MemberVo member);

    /**
     * 获取商家下拉列表
     * 
     * @param member
     * @return
     */
    List<Select> selectMerchant(MemberVo member);

}